package m.toolkit.codegenerator;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import m.framework.dao.mapping.BeanField;
import m.framework.exception.SystemException;
import m.framework.utils.StringUtil;
import m.toolkit.codegenerator.pdm.Column;
import m.toolkit.codegenerator.pdm.Table;

/**生成代码用的class配置信息*/
public class ClassConfig {
	
	private Table table;
	public ClassConfig(Table table,String pkg){
		this.table=table;
		this.pkg=pkg;
	}
	
	public String remark(){
		return table.getName();
	}
	
	public String pk(){
		return table.pkColum.getCode();
	}
	
	public String firstUpPk(){
		return StringUtil.firstUp(pk());
	}
	
	public String getName(){
		return table.modelName();
	}
	
	/**某个string的字段名称,生成testcase的时候要用这个字段
	 * 从table里找第一个是string的字段
	 * */
	public String strFiledName(){
		for(Column c:table.columns){
			//需要长度大于uuid的
			if(c.length<StringUtil.uuid().length()+4){
				continue;
			}
			if(c.getJavaType()==String.class){
				return c.getCode();
			}
		}
		throw new SystemException("整张表里居然没有1个放字符串的字段!!!!");
	}
	
	public String firstUpStrFiledName(){
		return StringUtil.firstUp(this.strFiledName());
	}
	
	//首字母大写的modelName
	public String firstUpName(){
		return StringUtil.firstUp(table.modelName());
	}
	
	private String pkg;
	/**字段里是否有时间*/
	public boolean hasDate(){
		for(Column c:table.columns){
			if(c.getJavaType()==Date.class){
				return true;
			}
		}
		return false;
	}
	
	/**所在包名*/
	public String getPkg(){
		return pkg;
	}
	
	/**用到系统的枚举类名称*/
	public List<String> enums(){
		List list=new ArrayList();
		for(Column c:table.columns){
			if(c.getJavaType()==Enum.class){
				list.add(c.getFirstUpJavaCode());
			}
		}
		return list;
	}
	
	//获得枚举内容,注释第一个都好以后内容
	public String enumContent(String fieldName){
		for(Column c:table.columns){
			if(c.getFirstUpJavaCode().equals(fieldName)){
				return c.comment;
			}
		}
		return "";
	}
	
	public String getTableValue(){
		return table.getName();
	}
	
	public List fields(){
		List list=new ArrayList();
		for(Column c:table.columns){
			ClassField f=new ClassField();
			f.column=c;
			if(f.isCcModelField()){
				continue;
			}
			list.add(f);
		}
		return list;
	}
	
	public class ClassField{
		private Column column;
		public String firstUpode(){
			return StringUtil.firstUp(column.getCode());
		}
		public boolean isCcModelField() {
			for(String str:ModelConfig.SYSTEM_FILEID){
				if(str.equalsIgnoreCase(column.getCode())){
					return true;
				}
			}
			return false;
		}
		public String getCode(){
			return column.getCode();
		}
		/**字段配置的column信息*/
		public String columnInfo(){
			StringBuilder sb=new StringBuilder();
			if(column.length!=BeanField.STRING_DEFAULT_LENGTH&&column.length!=0){
				sb.append(",length="+column.getLength());
			}
			if(column.dateOnly()){
				sb.append(",dateOnly="+true);
			}
			String validate=column.getValidate();
			if(StringUtil.isNotEmpty(validate)){
				sb.append(",validate=\""+validate+"\"");
			}
			return comment(sb);
		}
		private String comment(StringBuilder sb) {
			String value=column.comment;
			if(StringUtil.isEmpty(value)){
				value=column.getName();
			}
			
			if(!value.startsWith(column.getName())){
				value=column.getName()+","+value;
			}
			
			if(sb.length()==0){
				return "\""+value+"\"";
			}else{
				return "value=\""+value+"\""+sb;
			}
		}
		
		public String getJavaType(){
			Class cls= column.getJavaType();
			if(cls==Enum.class){
				return column.getFirstUpJavaCode();
			}
			return cls.getSimpleName();
		}
	}
	
	public String getRootPkg(){
		return Config.PROBJECT_ROOT_PKG;
	}
}
